home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / CheeseToast 1.0.1 / Source / Sprites.h < prev    next >
Text File  |  1993-05-07  |  8KB  |  277 lines

  1. // Sprites.h
  2. #include <stdarg.h>
  3. #include "QDOffscreen.h"
  4.  
  5.  
  6. /*
  7.  * Constants
  8.  */
  9.  
  10. #define DEBUGGING        1        // Enable debugging key and debugging sprites
  11. #define MaxSprites        200        // Maximum simultaneous sprites
  12. #define MaxScoreRecords    10        // Number of top scores shown
  13. #define ColorMapSize    1024L    // Size of 32x32 8-bit sprite map
  14. #define MaskMapSize        128L    // Size of 32x32 1-bit MaskMap
  15. #define BulletMapSize    4L        // Size of 2x2 8-bit bullet map
  16. #define IconWidth        32        // Width of Icon
  17. #define IconHeight        32        // Height of Icon
  18. #define BulletWidth        2        // Width/Height of Bullet
  19. #define StartupPICT        128        // Starup Picture Resource ID
  20. #define BackgroundPICT    129        // Background Picture Resource ID
  21. #define SmallLogoPICT    131        // Small Logo Picture ID (Attract Mode)
  22. #define NbrAsteroids    3        // Number compound asteroids in table
  23. #define MaxAngles        16        // Number of vectors in vector table
  24. #define NbrYummies        3
  25. #define AsterPoints        100
  26. #define SaucerPoints    500
  27. #define BarbellPoints    500
  28. #define LevelBonusScore    1000
  29.  
  30. /*
  31.  * Function Macros
  32.  */
  33.  
  34. #define AniFrameIndex(i)    (i << 10)    // Multiply by 1024 (ColorMapSize)
  35. #define AniRowIndex(i)        (i << 5)    // Multiply by 32 (rowsize)
  36.  
  37. /*
  38.  * Enumerated Types
  39.  */
  40.  
  41. enum ShipFlags     {SF_Fire=0x01, SF_Left=0x02, SF_Right=0x04,
  42.                   SF_Thrust=0x08, SF_Shield=0x10};
  43.  
  44. enum Sounds         {S_Firing, S_Explosion, S_BadGuyDebut, S_ShipDebut, S_ShipExplodes,
  45.                    S_EnemyFires, S_Thrust, S_DudBullet, 
  46.                    S_LevelCompletion, S_CompoundFracture, S_Shield, S_YummyConsume,
  47.                    S_HighScore1, S_LetterDisplay, S_ExtraShip, S_Loser, S_Startup,
  48.                    S_HighScore2,
  49.                    S_NbrSounds};
  50.  
  51.  
  52. enum GameStates    { GS_Attract, GS_Play, GS_GameOver };
  53.  
  54. enum SpriteTypes {
  55. // Visual Sprites
  56.                   ST_Wheel, ST_Aster, ST_Teacup, ST_WheelR, 
  57.                   ST_WheelG, ST_WheelB, ST_Aster1, ST_Aster2, 
  58.                   ST_Saucer, ST_Barbell, ST_Teapot, ST_TeapotT, 
  59.                   ST_TeapotS, ST_TeapotNew, ST_Yummies, ST_Bullet,
  60.                   ST_Photon, ST_Spark,
  61. // Logic Sprites
  62.                   ST_StatusDisplay,
  63. #if DEBUGGING
  64.                   ST_SpriteCnt, ST_MaxSprite,
  65. #endif
  66.                   NbrSprites};
  67.  
  68. enum BulletFlags {BF_GoodBullet=0x43FF, BF_BadBullet=0x1C00};
  69.  
  70. enum GameModes     {GM_X2=1, GM_X3=2, GM_X5=4};
  71.  
  72. /*
  73.  * Data Structures
  74.  */
  75.  
  76. typedef struct {
  77.     short    fireKey;
  78.     short    thrustKey;
  79.     short    leftKey;
  80.     short    rightKey;
  81.     short    shieldKey;
  82.     Boolean    soundLevel;
  83.     Str31    userName;
  84.     char    reserved[30];
  85. } PrefsData;
  86.  
  87. typedef struct    {
  88.     long    lh,lv;
  89. } LongPoint;
  90.  
  91. typedef struct {
  92.     Point        pos,oldPos;        // Sprite Coords
  93.     LongPoint    vector;            // Sprite Movement Velocity
  94.     short        type;            // Sprite Type - Index into Sprite Def Table
  95.     short        param1;            // Varies for each sprite type
  96.     short        param2;            // Varies for each sprite type
  97.     short        aniState;        // Animation Frame
  98.     short        aniSpeed;        // Animation Frame Rate
  99.     short        tickCtr;        // Time Counter
  100.     short        lifeSpan;        // Life Span of Sprite
  101.     short        angle;            // Index into Vector Table
  102.     short        width;            // Width of Sprite
  103.     Boolean        active,            // Sprite is Active
  104.                 update;            // Sprite needs updating onscreen
  105.     char        saveMap[1024];    // Screen save data
  106. } SpriteInstance;
  107.  
  108. typedef struct {
  109.     short    type;
  110.     short    firstIconID;
  111.     short    nbrIcons;
  112.     void    (*moveFunc)(register SpriteInstance *sp);
  113.     void    (*eraseFunc)(register SpriteInstance *sp);
  114.     void    (*drawFunc)(register SpriteInstance *sp);
  115.     Ptr        colorMaps;
  116.     Ptr        maskMaps;
  117. } SpriteDef;
  118.  
  119. typedef struct {
  120.     long    score;
  121.     short    level;
  122.     Str31    name;
  123. } ScoreRecord;
  124.  
  125. /*
  126.  * Extern Variables
  127.  */
  128.  
  129. extern short        gResFile;
  130. extern GWorldPtr    gOffScreen;
  131. extern PixMapHandle    gPixMap;
  132. extern short        gMaxSprite,gSpriteCnt,gSparkCnt,gAsteroidCnt,gRemainingShips;
  133. extern short        gYummyCnt;
  134. extern long            gScreenRowBytes,gVideoRowBytes;
  135. extern Ptr            gScreenMem,gVideoMem;
  136. extern Rect            gPlayRect,gOffscreenRect;
  137. extern long            gPlayWidth,gPlayHeight;
  138. extern Boolean        gSoundFlag;
  139. extern long            gGameClockTicks;        // 20 Frames per Second
  140. extern long            gLastDispTime;
  141. extern short        gGameState,gGameLevel;
  142. extern long            gGameScore;
  143. extern short        gScoreMode;
  144. extern SpriteInstance *sTable,*gShip;
  145. extern SpriteDef    sDef[NbrSprites];
  146. extern LongPoint    vecTable[MaxAngles];
  147. extern ScoreRecord    scoreRecord[MaxScoreRecords];
  148. extern PrefsData    gPrefs;
  149.  
  150. /*
  151.  * Function Declarations
  152.  */
  153.  
  154. // Low level Display
  155. void MyCopyBits(void);
  156. void MyCopyRect(register Rect *r);
  157.  
  158. // Picture Display
  159. void DisplayPicture(short picID, short hOffset, short vOffset);
  160.  
  161. // Game Control
  162. void InitializeGame(WindowPtr theWin);        // 1 Time only inits
  163. void CleanUp(void);                            // 1 Time only cleanup
  164. void MainGameLoop(WindowPtr theWin);
  165. void StartupScreen(void);
  166. void BeginAttract(void);
  167. void BeginGame(void);
  168. void EndGame(void);
  169. void InitLevel(void);
  170. void InitStatusDisplay(void);
  171. void StatusPrintf(short x, short y, char *tmp, ...);
  172. void DrawStatusBar(short curLevel, short maxLevel);
  173. void AddScore(short amt);
  174.  
  175. // Sprite Maintenence
  176. SpriteInstance *NewSprite(void);
  177. void KillSprite(SpriteInstance *sp);
  178. void NewShip(void);
  179. void NewSaucer(void);
  180. void NewBarbell(void);
  181. void NewAsteroid(short type);
  182. void NewYummy(void);
  183. void LaunchBullet(short type, short x, short y, long vx, long vy, short lifeSpan, short bType);
  184. void LaunchSpark(short x, short y, long vx, long vy, short lifeSpan, short color);
  185. void ExplodeSprite(register SpriteInstance *sp, register short lifeSpan);
  186.  
  187. // Util Funcs
  188. short min(register short x, register short y);
  189. short max(register short x, register short y);
  190.  
  191. #if DEBUGGING
  192. void NewDebugDisplay(void);
  193. #endif
  194.  
  195. // State Machine Functions
  196. void StandardSpriteErase(register SpriteInstance *);
  197. void StandardSpriteMove(register SpriteInstance *);
  198. void StandardSpriteDraw(register SpriteInstance *);
  199. void BulletErase(register SpriteInstance *);
  200. void BulletMove(register SpriteInstance *);
  201. void BulletDraw(register SpriteInstance *);
  202. void PhotonDraw(register SpriteInstance *);
  203. void SaucerMove(register SpriteInstance *);
  204. void BarbellMove(register SpriteInstance *);
  205. void YummyMove(register SpriteInstance *sp);
  206. void ShipMove(register SpriteInstance *);
  207. void SparkErase(register SpriteInstance *);
  208. void SparkMove(register SpriteInstance *);
  209. void SparkDraw(register SpriteInstance *);
  210. void NewShipTimer(register SpriteInstance *);
  211. void NullFunc(register SpriteInstance *);
  212. void StatusDraw(register SpriteInstance *);
  213. void QuakeMove(register SpriteInstance *);
  214.  
  215. #if DEBUGGING
  216. void SpriteCntMove(register SpriteInstance *);
  217. void MaxSpriteMove(register SpriteInstance *);
  218. #endif
  219.  
  220.  
  221. /*
  222.  * Game Tables
  223.  */
  224.  
  225. #if SPRITEMAIN
  226.  
  227. // Note: I'm using fixed point arithmetic here - the upper word is used for
  228. // screen coords
  229.  
  230. LongPoint    vecTable[MaxAngles] = {
  231.     0L,            -65536L,
  232.     25080L,        -60547L,
  233.     46341L,        -46341L,
  234.     60547L,        -25080L,
  235.     65536L,        0L,
  236.     60547L,        25080L,
  237.     46341L,        46341L,
  238.     25080L,        60547L,
  239.     0L,            65536L,
  240.     -25080L,    60547L,
  241.     -46341L,    46341L,
  242.     -60547L,    25080L,
  243.     -65536L,    0L,
  244.     -60547L,    -25080L,
  245.     -46341L,    -46341L,
  246.     -25080L,    -60547L};
  247.  
  248. // State Machines
  249. SpriteDef sDef[NbrSprites] = {
  250.     {ST_Wheel,     500, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  251.     {ST_Aster,  700, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  252.     {ST_Teacup, 600, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  253.     {ST_WheelR, 182, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  254.     {ST_WheelG, 194, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  255.     {ST_WheelB, 206, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  256.     {ST_Aster1, 218, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  257.     {ST_Aster2, 230, 12,    StandardSpriteMove, StandardSpriteErase, StandardSpriteDraw},
  258.     {ST_Saucer, 164, 18,    SaucerMove,            StandardSpriteErase, StandardSpriteDraw},
  259.     {ST_Barbell,4000,12,    BarbellMove,        StandardSpriteErase, StandardSpriteDraw},
  260.     {ST_Teapot, 2000,16,    ShipMove,             StandardSpriteErase, StandardSpriteDraw},
  261.     {ST_TeapotT,2100,16,    ShipMove,             StandardSpriteErase, StandardSpriteDraw},
  262.     {ST_TeapotS,2200,16,    ShipMove,             StandardSpriteErase, StandardSpriteDraw},
  263.     {ST_TeapotNew, 0, 0,    NewShipTimer,        NullFunc,             NullFunc},
  264.     {ST_Yummies,3000, NbrYummies,    YummyMove,    NullFunc,              NullFunc},
  265.     {ST_Bullet,    0,      0,    BulletMove,            BulletErase,         BulletDraw},
  266.     {ST_Photon,    0,      0,    BulletMove,            BulletErase,         PhotonDraw},
  267.     {ST_Spark,    0,      0,    SparkMove,            SparkErase,             SparkDraw},
  268.     {ST_StatusDisplay, 0,0, NullFunc,            NullFunc,             StatusDraw},
  269. #if DEBUGGING
  270.     {ST_SpriteCnt, 0, 0,    SpriteCntMove,        BulletErase,         PhotonDraw},
  271.     {ST_MaxSprite, 0, 0,    MaxSpriteMove,        BulletErase,         PhotonDraw},
  272. #endif
  273.     };
  274.  
  275. #endif
  276.  
  277. /* End of Sprites.h */